home *** CD-ROM | disk | FTP | other *** search
- /*
- File: MeetingPlace.c
-
- Contains: Where all the Interesting People come
-
- Written by: Guy Riddle
-
- Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
- */
-
- #include <Types.h>
- #include <QuickDraw.h>
- #include <Fonts.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Dialogs.h>
- #include <Desk.h>
- #include <ToolUtils.h>
- #include <Memory.h>
- #include <SegLoad.h>
- #include <Files.h>
- #include <Folders.h>
- #include <OSUtils.h>
- #include <DiskInit.h>
- #include <Scrap.h>
- #include <TextUtils.h>
-
- #include <String.h>
- #include <Strings.h>
- #include <stdio.h>
-
- #include <QuickTimeConferencing.h>
-
- #include "See.h"
-
- typedef EventRecord *EventRecordPtr;
- typedef Byte *BytePtr;
-
- #define MAXMEMBERS 6
-
- typedef struct {
- QElemPtr qLink;
- DialogRef window;
- ComponentInstance cc;
- MTConferenceToken conference;
- MTCString63 password;
- MTConferenceMember member[MAXMEMBERS+1];
- } PlaceHolder, *PlaceHolderPtr;
-
- QHdr gPlaces;
-
- #define PW_CLEAR 'pw-C'
-
- MTCapabilitiesList gCapabilities = { 1, { PW_CLEAR, 1, mtMessageRequiredCapability } };
-
- MTCString63 gPlaceName, gPassword;
- MTCString32 gServiceType;
-
- void Initialize(void);
- Boolean Configure(void);
- void EnableButton(DialogRef, short, Boolean);
- void GetValue(BytePtr, DialogRef, short);
- void SetValue(BytePtr, DialogRef, short);
- ComponentInstance StartMovieTalk(void);
- void EventLoop(void);
-
- void DoToolboxEvent(EventRecordPtr);
- void DoKeyDownEvent(EventRecordPtr);
- void DoMouseDownEvent(EventRecordPtr);
- void DoDiskEvent(EventRecordPtr);
- void AdjustMenus(void);
- void DoMenuBar(long);
- void DoAppleMenu(short);
- void DoFileMenu(short);
- void DoMenuNew(void);
- void DoMenuClose(void);
-
- void DoConferenceEvent(PlaceHolderPtr, MTConferenceEventPtr);
- void DoConfReady(PlaceHolderPtr, MTConferenceEventPtr);
- void DoMemberReady(PlaceHolderPtr, MTConferenceEventPtr);
- void DoMessageArrived(PlaceHolderPtr, MTConferenceEventPtr);
- void DoMemberTerminated(PlaceHolderPtr, MTConferenceEventPtr);
- void DoConfTerminated(PlaceHolderPtr, MTConferenceEventPtr);
- void DoIncomingCall(PlaceHolderPtr, MTConferenceEventPtr);
-
- int FindMember(PlaceHolderPtr, MTConferenceMember);
- void SetMember(PlaceHolderPtr, int, MTConferenceMember);
-
- /*
- * MeetingPlace
- *
- * This illustrates a conferencing application that sends and receives no media data,
- * just joins callers together.
- *
- * • No controllers are needed
- *
- * • No calls are placed
- *
- * • You can register multiple services in the same application, each gets a separate
- * conference component instance
- */
-
- void main()
- {
- Initialize();
-
- EventLoop();
- }
-
- void
- Initialize(
- void
- ){
- Handle menuBar;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- menuBar = GetNewMBar(rMeeterMenuBar);
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(mApple), 'DRVR');
-
- DrawMenuBar();
- }
-
- Boolean
- Configure(
- void
- ){
- DialogRef dp;
- short itemHit;
-
- dp = GetNewDialog(rNewPlace, 0, (WindowRef) -1);
- SetDialogCancelItem(dp, diCancel);
- SetDialogDefaultItem(dp, diOK);
- SetDialogTracksCursor(dp, true);
- PostEvent(keyDown, '\b'); // ick
-
- do{
- EnableButton(dp, diOK, gPlaceName[0] && gServiceType[0]);
-
- ModalDialog(0, &itemHit);
-
- GetValue(gPlaceName, dp, diName);
- GetValue(gPassword, dp, diPassword);
- GetValue(gServiceType, dp, diServiceType);
- }while(itemHit > diCancel);
-
- DisposeDialog(dp);
- InitCursor();
-
- return(itemHit == diOK);
- }
-
- void
- EnableButton(
- DialogRef dp,
- short item,
- Boolean enabled
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
-
- if(enabled)
- type &= ~itemDisable;
- else
- type |= itemDisable;
-
- HiliteControl((ControlHandle) ih, enabled ? 0 : 255);
-
- SetDialogItem(dp, item, type, ih, &rect);
-
- SetPort(dp);
- InsetRect(&rect, -5, -5);
- InvalRect(&rect);
- }
-
- void
- GetValue(
- BytePtr p,
- DialogRef dp,
- short item
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
- GetDialogItemText(ih, p);
-
- if(p[0] && p[p[0]] < ' '){
- p[0]--; // strip CR or other junk
- SetDialogItemText(ih, p);
- }
-
- p2cstr(p);
- }
-
- void
- SetValue(
- BytePtr p,
- DialogRef dp,
- short item
- ){
- Handle ih;
- Rect rect;
- short type;
- Str255 text;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
-
- SetDialogItemText(ih, c2pstr(strcpy((char*)text, (char*)p)));
- }
-
- ComponentInstance
- StartMovieTalk(
- void
- ){
- ComponentInstance cc;
- MTCapabilitiesHandle ch;
- MTCString63 service;
-
- cc = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- MTConferenceSetMode(cc, mtJoinerModeMask+mtShareableModeMask);
-
- if(gPassword[0]){
- PtrToHand((Ptr) &gCapabilities, (Handle *) &ch, sizeof(gCapabilities));
- MTConferenceSetMessageCapabilities(cc, ch);
- }
-
- sprintf((char*)service, "mtlkatlk\t%s\x0D", gServiceType);
-
- MTConferenceListen(cc, gPlaceName, gPlaceName, service);
-
- return(cc);
- }
-
- void
- EventLoop(
- void
- ){
- PlaceHolderPtr ph;
- EventRecord tEvent;
- MTConferenceEvent cEvent;
-
- for(;;){
- for(ph = (PlaceHolderPtr) gPlaces.qHead; ph; ph = (PlaceHolderPtr) ph->qLink)
- if(MTConferenceGetNextEvent(ph->cc, &cEvent))
- DoConferenceEvent(ph, &cEvent);
-
- if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
- DoToolboxEvent(&tEvent);
- }
- }
-
- void
- DoToolboxEvent(
- EventRecordPtr ev
- ){
- DialogRef dp;
- short item;
-
- if(IsDialogEvent(ev) && DialogSelect(ev, &dp, &item))
- return;
-
- switch(ev->what) {
- case mouseDown:
- DoMouseDownEvent(ev);
- break;
-
- case keyDown:
- DoKeyDownEvent(ev);
- break;
-
- case diskEvt:
- DoDiskEvent(ev);
- }
- }
-
- void
- DoMouseDownEvent(
- EventRecordPtr ev
- ){
- WindowPtr wp;
- Rect box;
- short part;
-
- part = FindWindow(ev->where, &wp);
-
- switch(part){
- case inMenuBar:
- AdjustMenus();
- DoMenuBar(MenuSelect(ev->where));
- break;
-
- case inGoAway:
- DoMenuClose();
- break;
-
- case inContent:
- SelectWindow(wp);
- break;
-
- case inDrag:
- box = (*GetGrayRgn())->rgnBBox;
-
- DragWindow(wp, ev->where, &box);
- }
- }
-
- void
- DoKeyDownEvent(
- EventRecordPtr ev
- ){
- if(ev->modifiers & cmdKey){
- AdjustMenus();
- DoMenuBar(MenuKey(ev->message & charCodeMask));
- }
- }
-
- void
- DoDiskEvent(
- EventRecordPtr ev
- ){
- Point where;
-
- if(HiWord(ev->message)){
- SetPt(&where, kDILeft, kDITop);
- DIBadMount(where, ev->message);
- }
- }
-
- void
- AdjustMenus(
- void
- ){
- MenuHandle mh;
-
- mh = GetMHandle(mpFile);
-
- FrontWindow() ? EnableItem(mh, ipClose) : DisableItem(mh, ipClose);
- }
-
- void
- DoMenuBar(
- long selection
- ){
- short menuID;
- short menuItem;
-
- menuID = HiWord(selection);
- menuItem = LoWord(selection);
-
- switch(menuID){
- case mApple:
- DoAppleMenu(menuItem);
- break;
-
- case mpFile:
- DoFileMenu(menuItem);
- break;
-
- case mEdit: /* call SystemEdit for DA editing & MultiFinder */
- SystemEdit(menuItem-1);
- }
-
- HiliteMenu(0);
- }
-
- void
- DoAppleMenu(
- short item
- ){
- DialogRef dp;
- Str255 daName;
- short itemHit;
-
- switch(item){
- case iAbout:
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- SetDialogDefaultItem(dp, 1);
-
- ModalDialog(0, &itemHit);
-
- DisposeDialog(dp);
- break;
-
- default: /* all non-About items in this menu are DAs */
- GetItem(GetMHandle(mApple), item, daName);
- OpenDeskAcc(daName);
- }
- }
-
- void
- DoFileMenu(
- short item
- ){
- switch(item){
- case ipNew:
- DoMenuNew();
- break;
-
- case ipClose:
- DoMenuClose();
- break;
-
- case ipQuit:
- while(FrontWindow())
- DoMenuClose();
-
- ExitToShell();
- }
- }
-
- void
- DoMenuNew(
- void
- ){
- PlaceHolderPtr ph;
- Str255 title;
-
- if(!Configure())
- return;
-
- ph = (PlaceHolderPtr) NewPtrClear(sizeof(PlaceHolder));
-
- ph->cc = StartMovieTalk();
- strcpy((char*)ph->password, (char*)gPassword);
-
- ph->window = GetNewDialog(rPlaceHolder, 0, (WindowRef) -1);
-
- sprintf((char*)title, "%s (%s)", gPlaceName, gServiceType);
- SetWTitle(ph->window, c2pstr((char*)title));
- ShowWindow(ph->window);
-
- Enqueue((QElemPtr) ph, &gPlaces);
- }
-
- void
- DoMenuClose(
- void
- ){
- PlaceHolderPtr ph;
- WindowRef wp;
-
- wp = FrontWindow();
-
- for(ph = (PlaceHolderPtr) gPlaces.qHead; ph; ph = (PlaceHolderPtr) ph->qLink)
- if(wp == ph->window)
- break;
- if(!ph)
- return;
-
- CloseComponent(ph->cc);
- DisposeDialog(ph->window);
-
- Dequeue((QElemPtr) ph, &gPlaces);
-
- DisposePtr((Ptr) ph);
- }
-
- void
- DoConferenceEvent(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- switch(ce->what){
- case mtIncomingCallEvent:
- DoIncomingCall(ph, ce);
- break;
-
- case mtConferenceReadyEvent:
- DoConfReady(ph, ce);
- break;
-
- case mtConferenceTerminatedEvent:
- DoConfTerminated(ph, ce);
- break;
-
- case mtMemberReadyEvent:
- DoMemberReady(ph, ce);
- break;
-
- case mtMemberTerminatedEvent:
- DoMemberTerminated(ph, ce);
- break;
-
- case mtMessageArrivedEvent:
- DoMessageArrived(ph, ce);
- }
-
- if(ce->surprise)
- DisposeHandle(ce->surprise);
- }
-
- void
- DoIncomingCall(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- if(!FindMember(ph, 0))
- MTConferenceReply(ph->cc, ce->who, sessTableErr);
- else if(!ph->password[0])
- MTConferenceReply(ph->cc, ce->who, 0);
- }
-
- int
- FindMember(
- PlaceHolderPtr ph,
- MTConferenceMember who
- ){
- int i;
-
- for(i = 1; i <= MAXMEMBERS; i++)
- if(who == ph->member[i])
- return(i);
-
- return(0);
- }
-
- void
- DoConfReady(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- if(ph->conference)
- MTConferenceMerge(ph->cc, ph->conference, ce->who);
- else
- MTConferenceActivateConference(ph->cc, ph->conference = ce->who, 0);
- }
-
- void
- DoMemberReady(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- int n;
-
- MTConferenceActivateMember(ph->cc, ce->who, 0);
-
- if(n = FindMember(ph, 0))
- SetMember(ph, n, ce->who);
- }
-
- void
- SetMember(
- PlaceHolderPtr ph,
- int n,
- MTConferenceMember who
- ){
- unsigned long datetime;
- Str255 string;
- BytePtr name;
-
- GetDateTime(&datetime);
- IUTimeString(datetime, false, string);
- p2cstr(string);
- strcat((char*)string, " ……");
-
- ph->member[n] = who;
-
- name = (BytePtr)(who ? MTConferenceGetMemberName(ph->cc, who) : "\p");
- SetValue(name, ph->window, dhMemberZero + n);
-
- name = (BytePtr)(who ? string : "\p");
- SetValue(name, ph->window, dhTimeZero + n);
- }
-
- void
- DoMemberTerminated(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- int n;
-
- if(n = FindMember(ph, ce->who))
- SetMember(ph, n, 0);
- }
-
- void
- DoMessageArrived(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- MTConferenceReply(ph->cc, ce->who, strcmp((char*)ph->password, *ce->surprise) ? afpUserNotAuth : 0);
- }
-
- void
- DoConfTerminated(
- PlaceHolderPtr ph,
- MTConferenceEventPtr ce
- ){
- if(ph->conference == ce->who)
- ph->conference = 0;
- }